/*
实现功能：
    1.模拟用户登录
    2.程序运行时 提供一个输入用户名和密码的入口
        用户提交用户名、密码之后提交信息，Java程序收集到用户信息
        Java程序连接数据库验证用户名、密码是否正确
        正确：显示登陆成功
        不正确：显示登陆失败
    3.数据的准备：
        在实际开发中，表的设计会使用专业的建模工具，安装PowerDesigner
        使用PD工具进行数据库表的设计（文件路径 脚本）
    4.SQL注入（无需账号登录MySQL）
        select * from t_user where loginName = 'fdsa' and loginPwd = 'fdsa' or '1'='1';
        正好完成sql语法拼接，以下代码含义是发送sql语句给DBMS，DBMS进行编译
        将用户提供的”非法信息”编译出去，导致原语句含义扭曲
    5.导致SQL注入的原因：
        用户输入的信息中含有sql语句的关键字，并且关键字参与了sql语句编译的过程，导致sql语句原意扭曲，进而达到sql注入
*/

import com.sun.javafx.collections.MappingChange;

import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class jdbcdemo07 {
    public static void main(String[] args) {
        //初始化一个界面
        Map<String,String> userLoginInfo =  initUI();
        //验证用户名和密码
        boolean loginSuccess = login(userLoginInfo);
        //最后输出结果
        System.out.println(loginSuccess ? "登陆成功":"登陆失败");
    }
    /*
    @param userLoginInfo 用户信息登录
    @return false：登录失败 true：登陆成功
     */
    private static boolean login(Map<String, String> userLoginInfo) {
        //打标记意识
        boolean loginSuccess = false;
        //单独定义变量
        String loginName = userLoginInfo.get("loginName");
        String loginPwd = userLoginInfo.get("loginPwd");
        //jdbc代码
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            //1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.获取连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/text","root","123456");
            //3.获取数据库操作对象
            stmt = conn.createStatement();
            //4.执行sql语句
            //String sql = "select * from t_user where LoginName= 'xxx' and LoginPwd = 'yyy'";
            String sql = "select * from t_user where loginName= '"+loginName+"' and loginPwd = '"+loginPwd+"'";
            rs = stmt.executeQuery(sql);
            //5.处理结果集
            if (rs.next()){
                //登录成功
                loginSuccess = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //6.释放资源
            if (rs != null) {
                try {
                    rs.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return loginSuccess;
    }

    /*
    初始化用户界面
    返回用户输入的用户名和密码等登录信息
    */
    private static Map<String, String> initUI() {
        Scanner s = new Scanner(System.in);
        System.out.println("用户名：");
        String loginName =  s.nextLine();
        System.out.println("密码：");
        String loginPwd = s.nextLine();
        Map<String,String> userLoginInfo = new HashMap<String, String>();
        userLoginInfo.put("loginName",loginName);
        userLoginInfo.put("loginPwd",loginPwd);
        return userLoginInfo;
    }


}
